package com.teamin.mapper;

import com.teamin.entity.CircleEntity;
import com.teamin.entity.CircleUserEntity;
import com.teamin.entity.NotifiEntity;
import com.teamin.vo.CircleVO;
import com.teamin.web.exception.GlobalErrorInfoException;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 圈子的DAO 层
 */
public interface CircleMapper {

    /**
     * 插入一个圈子 ID 会返回到 TaskEntity 中的circleId 中
     * @param  {circleName(必),createrId(必),img,descript}
     * @return 0 表示失败,1表示成功
     */
    int insertSelective(CircleEntity record);

    /**
     * 删除圈子
     * @param id
     * @return
     */
    int deleteCircleById(Long id);
    /**
     * 根据圈子的ID 查找圈子的详情
     * @param circleId
     * @return 圈子的详情信息
     */
    CircleEntity selectByPrimaryKey(@Param("circleId")Long circleId,@Param("userId")Long userId);
    /**
     * 根据圈子的ID 查找圈子的详情
     * @param circleId
     * @return 圈子的详情信息
     */
    CircleEntity selectWithUsersByPrimaryKey(@Param("circleId")Long circleId,@Param("userId")Long userId);

    /**
     * 更新圈子的详细信息,选择更新
     *   circleId;     //圈子ID 必
     *   circleName;    //圈子名称
     *   img;     //圈子图标
     *   descript ;//圈子的描述
     *  @param record
     * @return
     */
    int updateByPrimaryKeySelective(CircleEntity record);

    /**
     * 圈子中添加成员,如果存在相同的circleId,跟userId 会出抛出异常
     * @param circleId 必
     * @param userId 必
     * @return 1 表示成功,0表示失败
     */
    int addMemberToCircle(long circleId,long userId);

    /**
     * 圈子中移除成员
     * @param circleId 必
     * @param userId 必
     * @return 1 表示成功,0表示失败
     */
    int removeMemberToCircle(long circleId,long userId);

    /**
     * 查看圈子中所有成员
     * @param circleId 必
     * @param userIds 指定的用户
     * @return 1 表示成功,0表示失败
     */
    List<CircleUserEntity> selectMemberToCircle(@Param("circleId") Long circleId,@Param("userIds")List<Long> userIds);

    /**
     * 获取要能通知的用户
     * @param circleId
     * @param userIds 指定的用户
     * @return
     * @throws GlobalErrorInfoException
     */
    List<NotifiEntity> selectNotifiMember(@Param("circleId") Long circleId, @Param("userIds")List<Long> userIds);

    /**
     * 查看圈子中成员
     */
    CircleUserEntity selectMemberFromCircle(@Param("circleId")long circleId,@Param("userId")Long userId);

    /**
     * 查看用户所在的所有圈子
     * @param userId 必
     * @return 1 表示成功,0表示失败
     */
    List<CircleEntity> selectCircleByUser(@Param("userId")long userId);

    /**
     * 查看用户所在的所有圈子
     * @param userId 必
     * @return 1 表示成功,0表示失败
     */
    List<CircleEntity> selectCircleAndUser(@Param("userId")long userId);

    /**
     * 查询用户所在的圈子列表 包含用户最后一条围度消息
     */
    List<CircleVO> selectUserCircleV012(@Param("userId")Long userId,@Param("circleId")Long circleId);

    /**
     * 查询任务的圈子
     * @param taskId
     * @return
     */
    CircleEntity selectCirclesByTask(@Param("taskId") Long taskId,@Param("userId") Long userId) ;


    /**
     * 查询圈子的ID
     * @param taskId
     * @return
     */
    Long selectCircleIdByTask(@Param("taskId") Long taskId,@Param("userId") Long userId) ;

    /**
     * 查询圈子的ID
     * @param taskId
     * @return
     */
    Long selectOnlyCircleIdByTask(@Param("taskId") Long taskId) ;

    /**
     * 判断圈子存在
     * @param circleId
     * @return
     */
	Boolean circleExist(@Param("circleId") Long circleId);



    /**
     * 获取圈子中第一个加入的成员ID
     * @param circleId 圈子ID
     * @return 成员ID
     */
    Long getFirstUserId(@Param("circleId") Long circleId);

    /**
     * 判断用户是不是圈子的创建者
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return 成员ID
     */
    boolean isCreater(@Param("circleId") Long circleId,@Param("userId") Long userId) ;

    /**
     * 修改圈子中用户的昵称
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return
     */
    boolean updateUserInfo(@Param("circleId")Long circleId, @Param("userId")Long userId, @Param("nickName")String nickName,@Param("circlePhone")String circlePhone,@Param("circleEmail")String circleEmail,@Param("circleJob")String circleJob);

    /**
     * 新增圈子中用户的昵称信息
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return
     */
    int insertUserInfo(@Param("circleId")Long circleId, @Param("userId")Long userId, @Param("nickName")String nickName,@Param("circlePhone")String circlePhone,@Param("circleEmail")String circleEmail,@Param("circleJob")String circleJob);

    /**
     * 是否存在圈子中的用户信息
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return
     */
    boolean existUserInfo(@Param("circleId")Long circleId, @Param("userId")Long userId);


    /**
     * 判断圈子是否存在
     * @param circleId 圈子ID
     * @return 成员ID
     */
    boolean existCircle(@Param("circleId") Long circleId) ;

    /**
     * 根据任务查询圈子的信息
     * @param taskId circle id
     * @param userId task id
     * @return 成员ID
     */
    CircleEntity selectCircleByTask(@Param("taskId") Long taskId,@Param("userId") Long userId) ;

    /**
     * 圈子的成员数量
     * @param circleId 圈子ID
     * @return 成员ID
     */
    public Long selectMemberCount(@Param("circleId") Long circleId) ;

    /**
     * 获取圈子的名称
     * @param circleId
     * @return
     */
    public String selectCircleName(@Param("circleId") Long circleId) ;

    /**
     * 圈子置顶
     * @param circleId
     * @param userId
     * @param stick 1表示置顶,其他表示取消置顶
     */
    public int stickCircle(@Param("circleId") Long circleId,@Param("userId") Long userId,@Param("stick") Integer stick) ;

    /**
     * 获取用户在圈子中的nickname
     * @param circleId
     * @param userId
     */
    public String getNickName(@Param("circleId") Long circleId,@Param("userId") Long userId) ;

    /**
     * 判断任务是否属于圈子
     * @param circleId
     * @return
     */
    Boolean existTask(@Param("circleId") Long circleId,@Param("taskId") Long taskId);

}